package com.hu.system.converter;

import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.ReadCellData;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import com.hu.common.utils.DateUtils;
import com.hu.common.utils.StringUtils;
import org.apache.poi.ss.usermodel.DateUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 容错Date转换器
 * 参考原ExcelUtil的转换逻辑
 * <p>
 * 转换规则（与原ExcelUtil保持一致）：
 * 1. 数字类型：检查是否为日期格式，是则转Date
 * 2. 字符串类型：尝试多种日期格式解析
 * 3. 空值：返回null
 * 4. 异常情况：返回null（不抛异常）
 *
 * @author hu-erp
 */
public class TolerantDateConverter implements Converter<Date> {

    private static final Logger log = LoggerFactory.getLogger(TolerantDateConverter.class);

    // 支持的日期格式（与ExcelUtil保持一致）
    private static final String[] DATE_PATTERNS = {
            "yyyy-MM-dd HH:mm:ss",
            "yyyy-MM-dd",
            "yyyy/MM/dd HH:mm:ss",
            "yyyy/MM/dd",
            "yyyy年MM月dd日",
            "yyyyMMdd",
            "yyyy.MM.dd",
            "yyyy-MM-dd'T'HH:mm:ss",
            "yyyy-MM-dd'T'HH:mm:ss.SSS",
            "dd/MM/yyyy",
            "MM/dd/yyyy"
    };

    @Override
    public Class<Date> supportJavaTypeKey() {
        return Date.class;
    }

    @Override
    public CellDataTypeEnum supportExcelTypeKey() {
        return null; // 支持所有Excel类型
    }

    /**
     * 读取Excel时的转换
     * 参考ExcelUtil.getCellValue中DateUtil.isCellDateFormatted的逻辑
     */
    @Override
    public Date convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty,
                                  GlobalConfiguration globalConfiguration) {
        if (cellData == null) {
            return null;
        }

        try {
            Object val = "";

            // 第一步：根据单元格类型获取值
            switch (cellData.getType()) {
                case NUMBER:
                    // 数字类型 - Excel日期存储为数字（公式单元格会自动计算为结果值）
                    BigDecimal numberValue = cellData.getNumberValue();
                    if (numberValue != null) {
                        // POI的DateUtil.isCellDateFormatted检查
                        // EasyExcel已经处理了日期检测，直接尝试获取
                        try {
                            // 如果是日期格式的数字，转为Date
                            return DateUtil.getJavaDate(numberValue.doubleValue());
                        } catch (Exception e) {
                            // 如果不是日期格式，返回null
                            log.debug("数字 '{}' 不是日期格式", numberValue);
                            return null;
                        }
                    }
                    break;

                case STRING:
                    // 字符串类型
                    String stringValue = cellData.getStringValue();
                    if (stringValue != null) {
                        val = stringValue.trim();
                    }
                    break;

                case ERROR:
                case BOOLEAN:
                case EMPTY:
                default:
                    return null;
            }

            // 第二步：字符串日期解析
            String strVal = StringUtils.isNull(val) ? "" : val.toString().trim();

            // 空值返回null
            if (strVal.isEmpty()) {
                return null;
            }

            // 尝试多种日期格式解析
            for (String pattern : DATE_PATTERNS) {
                try {
                    SimpleDateFormat sdf = new SimpleDateFormat(pattern);
                    sdf.setLenient(false); // 严格解析
                    return sdf.parse(strVal);
                } catch (ParseException ignored) {
                    // 继续尝试下一个格式
                }
            }

            // 如果所有格式都失败，尝试使用DateUtils工具类
            try {
                return DateUtils.parseDate(strVal);
            } catch (Exception e) {
                log.debug("无法解析日期字符串 '{}'", strVal);
                return null;
            }

        } catch (Exception e) {
            // 异常情况返回null
            log.warn("转换Date失败，返回null", e);
            return null;
        }
    }

    /**
     * 写入Excel时的转换
     */
    @Override
    public WriteCellData<?> convertToExcelData(Date value, ExcelContentProperty contentProperty,
                                                GlobalConfiguration globalConfiguration) {
        if (value == null) {
            return new WriteCellData<>("");
        }
        // 格式化为字符串
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return new WriteCellData<>(sdf.format(value));
    }
}

